package com.wyx.controller;


import com.wyx.pojo.User;
import com.wyx.service.UserService;
import com.wyx.utils.CommonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 * 用户表 前端控制器
 * </p>
 *
 * @author 王玉星
 * @since 2021-08-03
 */

@RequiredArgsConstructor
@Data
@RestController
@RequestMapping("/user")
@Api(tags = "用户信息接口", value = "对用户信息的增删改查，等一系列的控制")     // 标注这个类的主要作用，tags 在 ui 显示，value 不显示
public class UserController {

    @NonNull
    UserService userService;

    // value 表示方法的作用在 ui 上显示 ,notes 方法的具体描述 , 给方法重新打开一个接口文档
    @ApiOperation(value = "根据id获取用户信息", notes = " \n 用户请求 /get/1 对应获取用户ID 为 1 的用户信息", tags = "查询单个用户信息")
    // 表示参数的信息，name 参数名，value 参数说明(ui显示)，paramType 请求参数类型(path 路径参数，query 查询参数)
    // dataType 请求参数的类型，required 是否为必须，默认false
    @ApiImplicitParam(name = "id", value = "用户ID", paramType = "path" ,dataType = "String",required = true)
    /*
    多参数时使用如下
    @ApiImplicitParams(
            @ApiImplicitParam(),
            @ApiImplicitParam
    )
     */
    @GetMapping("/get/{id}")
    public  CommonResult getId(@PathVariable String id){
        User user = userService.getById(id);
        return (user == null) ? CommonResult.isNull():CommonResult.Success(user);
    }

    /*
    @RequiredArgsConstructor，来源于 lombok
    解决我们在注入参数是需要使用
    @Autowired
    private UserService userService;
    我们只需要在类上添加 @RequiredArgsConstructor,在注入是写出如下 需要注意的是在注入时需要用final定义，或者使用@notnull注解
    final UserService userService;
    或者
    @NonNull
    UserService userService;

    @RequiredArgsConstructor 的几个常用参数
    1. access 声明注入的对象的属性 public private protected(默认 public)
    eg : @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
    2. staticName 将类中的静态方法注明，其实在实战中，使用较少
    eg : @RequiredArgsConstructor(staticName = "getId") (默认为空，getId方法名)
    3. onConstructor 设置构造器注入时使用的注解
    在 jdk1.7之前如下    代表注入构造器注入时，使用 @Autowired注入
    eg ：onConstructor=@__({@Autowired})
    在 jdk1.8之后如下
    eg ：onConstructor_={@Autowired}
     */
}

